package com.wongsi.spring5.controller;

import com.wongsi.spring5.entity.Taco;
import com.wongsi.spring5.repository.JpaTacoRepository;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Optional;

//@RestController
//@RequestMapping(path = "/design", produces = "application/json")
//@CrossOrigin(origins = "*")
public class DesignTacoController {
    @Resource
    private JpaTacoRepository tacoRepo;

    @GetMapping("/recent")
    public Iterable<Taco> recentTacos() {
        PageRequest page = PageRequest.of(0, 12, Sort.by("createAt").descending());
        return tacoRepo.findAll();
    }

    @GetMapping("/{id}")
    public ResponseEntity<Taco> tacoById(@PathVariable("id") Long id) {
        Optional<Taco> optTaco = tacoRepo.findById(id);
        if (optTaco.isPresent()) {
            return new ResponseEntity<>(optTaco.get(), HttpStatus.OK);
        }
        return new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
    }

    // 使用@PostMapping创建资源，
    //
    // consumes属性 用于指定请求输入，
    // produces    用于指定请求输出。

    // @RequestBody注解，
    // 表明请求应该被转换为一个Taco对象并绑定到该参数上。
    // 这个注解是非常重要的，
    // 如果没有它，Spring MVC将会认为我们希望将请求参数（要么是查询参数，要么是表单参数）绑定到Taco上。
    // 但是，@RequestBody注解能够确保请求体中的JSON会被绑定到Taco对象上。

    // 在POST请求的情况下，201 (CREATED)的HTTP状态更具有描述性。
    // 它会告诉客户端，请求不仅成功了，还创建了一个资源。
    // 在适当的地方使用@ResponseStatus将最具描述性和最精确的HTTP状态码传递给客户端是一种更好的做法。
    @PostMapping(consumes="application/json")
    @ResponseStatus(HttpStatus.CREATED)
    public Taco postTaco(@RequestBody Taco taco) {
        return tacoRepo.save(taco);
    }




}
